속성 (컴퓨터 프로그래밍)
1. 개요
1. 개요
속성은 객체 지향 프로그래밍에서 클래스와 객체의 핵심 구성 요소이다. 이는 객체의 상태나 데이터를 저장하는 역할을 하며, 필드 또는 멤버 변수라고도 불린다. 속성은 객체가 가질 수 있는 다양한 특징, 예를 들어 사용자 객체의 이름이나 나이, 자동차 객체의 색상이나 속도 등을 정의하는 데 사용된다.
속성은 일반적으로 캡슐화 원칙에 따라 private 접근 제어자를 사용하여 선언된다. 이는 객체의 내부 데이터를 외부에서 직접 접근하거나 수정하는 것을 제한하여 데이터의 무결성을 보호하기 위함이다. 대신, 외부 코드는 게터와 세터라고 불리는 특별한 메서드를 통해 속성의 값을 안전하게 읽거나 변경할 수 있다.
이러한 접근 방식은 데이터 검증 로직을 세터 메서드 내에 포함시켜 유효하지 않은 값이 설정되는 것을 방지할 수 있게 한다. 또한, 속성의 내부 구현 방식을 변경하더라도 이를 사용하는 외부 코드에는 영향을 미치지 않도록 할 수 있어, 코드의 유지보수성과 안정성을 높이는 데 기여한다.
2. 특징
2. 특징
속성은 객체 지향 프로그래밍에서 클래스와 객체의 핵심적인 데이터를 담는 구성 요소이다. 이는 객체의 상태를 나타내는 정보를 저장하는 역할을 하며, 객체의 고유한 특징이나 현재 상황을 정의한다.
속성의 주요 특징 중 하나는 캡슐화 원칙을 따르기 위해 접근 제어자를 활용한다는 점이다. 대부분의 경우 속성은 private으로 선언되어 외부 코드에서 직접 값을 읽거나 변경하는 것을 차단한다. 이는 객체 내부 데이터의 무결성을 보호하고, 객체의 상태를 안전하게 관리할 수 있게 해준다.
이러한 직접 접근의 제한을 극복하고 속성 값을 안전하게 조작하기 위해 게터와 세터라는 특별한 메서드가 사용된다. 게터 메서드는 private 속성의 값을 읽어 반환하는 역할을 하고, 세터 메서드는 새로운 값을 할당하기 전에 필요한 검증 로직을 수행할 수 있다. 이를 통해 속성에 대한 접근과 수정을 통제할 수 있다.
또한, 속성은 단순한 데이터 저장소를 넘어서는 역할도 할 수 있다. 계산된 속성의 경우, 게터 메서드 내에서 다른 속성들을 기반으로 실시간으로 값을 계산하여 반환할 수 있다. 이는 객체의 상태를 유연하게 표현하는 방법을 제공한다.
3. 구현 방식
3. 구현 방식
3.1. 게터와 세터
3.1. 게터와 세터
속성의 가장 기본적인 구현 방식은 게터와 세터 메서드를 사용하는 것이다. 게터는 속성의 값을 읽어오는 메소드이며, 세터는 속성의 값을 설정하거나 변경하는 메소드이다. 이 두 메소드는 일반적으로 각각 get과 set이라는 접두사를 속성 이름 앞에 붙여서 명명한다.
이러한 접근자 메소드를 사용하는 주된 이유는 캡슐화 원칙을 지키기 위해서이다. 클래스의 내부 필드를 private으로 선언하여 외부에서 직접 접근하지 못하도록 숨긴 후, 공개된 게터와 세터를 통해서만 해당 데이터에 접근하도록 제어한다. 이를 통해 클래스 내부 구현을 외부로부터 보호할 수 있다.
게터와 세터를 사용하면 데이터에 접근하거나 변경할 때 추가적인 로직을 실행할 수 있다는 장점이 있다. 예를 들어, 세터 메소드 안에서 전달받은 새로운 값이 유효한 범위 내에 있는지 검증하는 코드를 추가할 수 있다. 또는 게터 메소드에서 단순히 저장된 값을 반환하는 대신, 필요에 따라 다른 필드 값을 기반으로 계산된 결과를 반환하도록 구현할 수도 있다.
이 방식은 자바와 같은 초기 객체 지향 언어에서 널리 사용되었다. C++에서도 비슷한 패턴으로 구현된다. 이 패턴은 코드의 안정성을 높여주지만, 모든 필드에 대해 일일이 게터와 세터 메소드를 작성해야 하므로 상용구 코드가 많아진다는 단점이 있다.
3.2. 프로퍼티 문법
3.2. 프로퍼티 문법
프로퍼티 문법은 게터와 세터 메서드를 언어 차원에서 지원하는 특별한 문법이다. 이 문법을 사용하면 개발자가 별도의 메서드를 명시적으로 작성하지 않고도, 필드에 접근하는 것처럼 보이는 코드로 캡슐화된 데이터의 읽기와 쓰기를 처리할 수 있다. 많은 현대 객체 지향 프로그래밍 언어는 이 문법을 도입하여 코드의 가독성을 높이고 보일러플레이트 코드를 줄였다.
구체적으로, 프로퍼티 문법은 클래스 내부에 get 접근자와 set 접근자를 정의하는 형태로 구현된다. 외부에서는 객체.프로퍼티명과 같은 형태로 값을 읽거나 객체.프로퍼티명 = 값과 같은 형태로 값을 쓸 수 있다. 이때 실제로는 내부적으로 미리 정의된 get 블록의 코드가 실행되어 값을 반환하거나, set 블록의 코드가 실행되어 값을 검증하거나 다른 필드에 할당하는 등의 로직을 수행한다. 이는 사용자에게는 단순한 필드 접근처럼 보이지만, 내부적으로는 메서드 호출의 이점을 그대로 유지하는 구조이다.
예를 들어, C#이나 Kotlin과 같은 언어에서는 프로퍼티를 일급 시민으로 취급하는 명시적인 문법을 제공한다. Python에서는 @property 데코레이터를 사용하여 메서드를 프로퍼티로 변환할 수 있으며, JavaScript에서는 Object.defineProperty() 메서드나 최신 getter 및 setter 문법을 통해 유사한 기능을 구현한다. 이러한 문법적 지원 덕분에 데이터 은닉 원칙을 지키면서도 더 간결하고 직관적인 코드 작성이 가능해진다.
3.3. 필드와 메서드
3.3. 필드와 메서드
필드는 객체 지향 프로그래밍에서 클래스 내부에 선언된 멤버 변수로, 객체의 상태나 데이터를 저장하는 역할을 한다. 예를 들어, 사람 클래스의 이름이나 나이와 같은 정보가 필드에 해당한다. 필드는 객체의 고유한 특성을 나타내며, 일반적으로 private이나 protected 같은 접근 제어자를 사용해 외부에서 직접 접근하지 못하도록 캡슐화하는 것이 일반적이다.
메서드는 클래스 내부에 정의된 함수로, 객체의 행동이나 기능을 구현한다. 메서드는 주로 객체의 상태를 변경하거나, 특정 작업을 수행하거나, 계산된 결과를 반환하는 데 사용된다. 예를 들어, 사람 클래스의 걷다()나 말하다()와 같은 행동이 메서드로 표현될 수 있다. 메서드는 매개변수를 받을 수 있고, 값을 반환할 수도 있다.
필드와 메서드는 객체의 두 가지 핵심 구성 요소로, 필드는 '무엇인가(상태)'를, 메서드는 '무엇을 하는가(행동)'를 정의한다. 객체의 상태인 필드는 메서드를 통해 안전하게 조작된다. 예를 들어, private으로 선언된 나이 필드는 외부에서 직접 변경할 수 없으며, set나이() 같은 세터 메서드를 통해 유효성 검사를 거친 후에만 값이 설정된다.
이러한 구분은 객체 지향 설계의 기본 원칙을 따르며, 데이터와 그 데이터를 처리하는 로직을 하나의 단위로 묶어 모듈성을 높이고 코드의 유지보수성을 향상시킨다. 속성은 종종 내부적으로는 필드와 이를 접근하는 게터 및 세터 메서드의 조합으로 구현되어, 사용자에게는 단일한 데이터 멤버처럼 보이게 한다.
4. 사용 목적
4. 사용 목적
4.1. 캡슐화
4.1. 캡슐화
속성은 캡슐화를 실현하는 핵심적인 수단이다. 캡슐화는 객체 지향 프로그래밍의 기본 원칙 중 하나로, 객체의 내부 데이터와 구현 세부 사항을 외부로부터 숨기고, 공개된 인터페이스를 통해서만 상호작용하도록 하는 것을 의미한다. 속성을 사용하면 클래스 내부의 필드를 private이나 protected와 같은 접근 제어자로 선언하여 외부에서 직접 조작하는 것을 막을 수 있다.
이렇게 내부 상태를 보호한 상태에서, 외부에서는 게터와 세터라고 불리는 특별한 메서드를 통해서만 해당 데이터에 접근하거나 수정할 수 있다. 예를 들어, 나이를 저장하는 필드에 음수 값이 설정되지 않도록 검증 로직을 세터 메서드 내에 추가할 수 있다. 이는 단순히 데이터를 숨기는 것을 넘어, 객체의 무결성을 보장하고 유효하지 않은 상태로 전환되는 것을 방지하는 역할도 한다.
따라서 속성을 통한 캡슐화는 코드의 안정성과 유지보수성을 크게 향상시킨다. 내부 구현 방식이 변경되더라도, 공개된 게터와 세터의 인터페이스를 그대로 유지하면 해당 클래스를 사용하는 외부 코드를 수정할 필요가 없어진다. 이는 정보 은닉의 개념과도 직접적으로 연결되며, 모듈 간의 결합도를 낮추고 소프트웨어의 복잡성을 관리하는 데 기여한다.
4.2. 데이터 검증
4.2. 데이터 검증
속성의 중요한 사용 목적 중 하나는 데이터 검증이다. 클래스 내부의 필드에 직접 접근할 수 있도록 허용하면, 객체의 상태를 나타내는 데이터에 잘못된 값이 설정될 위험이 있다. 예를 들어 나이를 나타내는 필드에 음수 값이 할당되거나, 이메일 주소 필드에 형식에 맞지 않는 문자열이 들어갈 수 있다. 속성을 통해 게터와 세터를 구현하면, 이러한 문제를 방지할 수 있다.
세터 메서드 내부에 검증 로직을 추가함으로써, 객체의 무결성을 보장한다. 값이 설정되기 전에 사전 조건을 확인하고, 조건을 만족하지 않는 값에 대해서는 예외를 발생시키거나 기본값으로 대체하는 등의 처리를 할 수 있다. 이는 객체 지향 프로그래밍의 핵심 원칙 중 하나인 캡슐화를 실현하는 구체적인 방법이다. 내부 데이터를 보호하면서도, 유효한 상태 변경만을 허용하는 통제된 인터페이스를 제공하는 것이다.
데이터 검증은 단순히 값의 범위나 형식을 넘어서 비즈니스 규칙을 적용하는 데에도 사용된다. 예를 들어, 주문 객체의 '상태' 속성을 '배송 완료'로 변경하려면 먼저 '결제 완료' 상태인지 확인하는 로직을 세터에 포함시킬 수 있다. 이러한 검증 로직이 속성 설정이라는 단일 지점에 집중되면, 코드의 유지보수성과 신뢰성이 크게 향상된다. 객체는 항상 유효한 상태를 유지하게 되며, 잘못된 데이터로 인한 런타임 오류를 사전에 방지할 수 있다.
4.3. 계산된 속성
4.3. 계산된 속성
계산된 속성은 클래스 내부에 실제 데이터를 저장하는 필드나 멤버 변수를 가지지 않으면서, 게터 메서드를 통해 값을 반환할 때마다 필요한 계산을 수행하는 속성을 의미한다. 이는 객체의 현재 상태를 기반으로 동적으로 값을 도출해야 할 때 유용하게 사용된다. 예를 들어, 직원 객체의 나이나 근속 연수와 같은 정보는 저장된 생년월일이나 입사일로부터 매번 계산하여 제공할 수 있다.
계산된 속성의 구현은 주로 게터 메서드 내에 계산 로직을 포함하는 방식으로 이루어진다. 세터 메서드는 제공되지 않거나, 제공되더라도 전달받은 값을 기반으로 내부의 다른 필드 값을 업데이트하는 방식으로 동작한다. 이는 사용자에게는 일반 속성처럼 보이지만, 내부적으로는 메서드 호출을 통해 값을 생성한다는 점에서 일반 속성과 차이가 있다.
이러한 접근 방식은 데이터의 일관성을 유지하고 중복 저장을 방지하는 데 도움이 된다. 나이나 총액과 같이 다른 기저 데이터로부터 파생될 수 있는 정보를 별도로 저장하지 않고 필요할 때마다 계산함으로써, 기저 데이터가 변경되었을 때 파생 데이터의 동기화 문제를 근본적으로 해결할 수 있다. 따라서 계산된 속성은 객체 지향 프로그래밍의 캡슐화 원칙을 잘 보여주는 패턴 중 하나이다.
다양한 프로그래밍 언어는 계산된 속성을 지원하기 위한 특별한 문법을 제공하기도 한다. C#의 경우 get 접근자 블록 내에 계산 로직을 작성할 수 있으며, Python에서는 @property 데코레이터를 사용하여 게터 메서드를 정의한다. JavaScript의 게터 역시 함수를 값처럼 접근할 수 있게 하여 계산된 속성을 구현하는 데 사용된다.
5. 프로그래밍 언어별 예시
5. 프로그래밍 언어별 예시
5.1. Java
5.1. Java
자바에서는 속성을 직접적으로 지원하는 문법이 존재하지 않는다. 대신, 클래스의 필드를 정의하고, 이 필드에 대한 접근과 수정을 게터와 세터라는 메서드 쌍을 통해 제어하는 방식으로 구현한다. 이는 객체 지향 프로그래밍의 핵심 원칙 중 하나인 캡슐화를 실현하는 일반적인 방법이다.
자바에서 속성은 주로 private 접근 제어자를 사용하여 선언된다. 이렇게 하면 해당 필드는 클래스 외부에서 직접 접근할 수 없게 되며, 클래스 내부의 메서드를 통해서만 상태를 읽거나 변경할 수 있다. 상태를 읽기 위한 getter 메서드와 상태를 변경하기 위한 setter 메서드를 public으로 제공함으로써, 외부 객체는 이 메서드들을 통해 안전하게 데이터에 접근한다.
이러한 접근자 메서드를 사용하는 주요 목적은 데이터 무결성을 보장하는 것이다. setter 메서드 내부에 데이터 검증 로직을 추가하여 유효하지 않은 값이 필드에 저장되는 것을 방지할 수 있다. 또한, 필드의 값을 단순히 반환하는 것이 아닌, 필요에 따라 계산을 수행한 결과를 반환하는 계산된 속성의 역할도 getter 메서드에서 구현 가능하다.
5.2. C#
5.2. C#
C#에서는 프로퍼티라는 전용 문법을 통해 속성을 정의한다. C#의 프로퍼티는 게터와 세터 접근자를 포함하는 특별한 종류의 클래스 멤버로, 필드를 캡슐화하는 표준적인 방법을 제공한다. 이는 자바와 같이 별도의 게터 및 세터 메서드를 명시적으로 작성하는 방식과 구분된다.
C# 프로퍼티의 기본 구조는 public 데이터형식 속성이름 { get; set; }과 같다. 컴파일러는 이를 처리할 때 자동으로 숨겨진 백킹 필드와 적절한 접근자 메서드를 생성한다. 개발자는 필요에 따라 접근자 내부에 로직을 추가할 수 있다. 예를 들어, 세터 내부에 데이터 검증 코드를 넣거나, 게터에서 다른 필드 값을 기반으로 계산된 결과를 반환하는 계산된 속성을 구현할 수 있다.
C# 3.0부터 도입된 자동 구현 속성은 get;과 set; 접근자만 선언하는 간결한 문법으로, 별도의 백킹 필드 선언 없이도 속성을 빠르게 정의할 수 있게 한다. 이후 버전에서는 초기화를 위한 더욱 다양한 기능이 추가되었다. 이러한 프로퍼티 문법은 코드의 가독성을 높이고, 객체 지향 프로그래밍의 캡슐화 원칙을 언어 수준에서 편리하게 지원하는 핵심 요소이다.
5.3. Python
5.3. Python
파이썬은 게터와 세터 메서드를 명시적으로 정의하는 대신, @property 데코레이터를 사용하여 속성을 구현하는 독특한 방식을 제공한다. 클래스 내부에 @property 데코레이터를 붙인 메서드를 정의하면, 이 메서드는 인스턴스의 필드처럼 접근할 수 있는 계산된 속성이 된다. 이때 메서드의 이름이 속성의 이름이 된다.
예를 들어, temperature라는 속성에 대한 게터 메서드를 @property로 장식하고, 같은 이름의 메서드를 @temperature.setter로 장식하여 세터를 정의할 수 있다. 이를 통해 사용자는 obj.temperature = 20과 같은 직관적인 문법으로 값을 할당하거나 조회할 수 있지만, 실제로는 내부의 _temperature와 같은 프라이빗 변수에 접근하거나, 세터 메서드 내에서 데이터 검증 로직을 실행하게 된다.
파이썬의 이 방식은 캡슐화를 유지하면서도 코드를 간결하고 읽기 쉽게 만든다. 또한 @property를 사용하면 기존의 인스턴스 변수에 대한 접근 방식을 나중에 계산된 속성으로 변경하더라도 클래스의 인터페이스를 깨뜨리지 않을 수 있어 유연하다. @property.deleter를 정의하여 속성 삭제 시의 동작도 제어할 수 있다.
5.4. JavaScript
5.4. JavaScript
자바스크립트는 ECMAScript 5(ES5)부터 게터와 세터를 지원하는 접근자 프로퍼티를 도입하여 속성의 개념을 구현한다. 객체 리터럴 내에서 get과 set 키워드를 사용하거나, Object.defineProperty 메서드를 통해 계산된 속성이나 접근 제어를 정의할 수 있다. 이는 자바나 C#과 같은 언어의 클래스 기반 속성과는 다른, 프로토타입 기반 프로그래밍 언어의 특징을 반영한 방식이다.
ES6(ES2015)에서 도입된 클래스 문법을 사용할 때도, 메서드 앞에 get과 set 키워드를 붙여 접근자 프로퍼티를 정의할 수 있다. 이를 통해 캡슐화를 달성하고, 속성에 접근할 때 추가적인 로직을 실행하거나, 데이터 검증을 수행하는 것이 가능해진다. 예를 들어, 속성에 값을 할당할 때 세터를 통해 유효성을 검사할 수 있다.
접근 방식 | 설명 | 예시 코드 (간략) |
|---|---|---|
객체 리터럴 | 객체 생성 시 |
|
| 기존 객체에 동적으로 속성 추가 |
|
클래스 문법 | 클래스 내부에 |
|
자바스크립트의 속성은 기본적으로 퍼블릭이며, 프라이빗 필드를 완전히 지원하기 시작한 것은 비교적 최근의 일이다. ES2022에서 정식으로 채택된 프라이빗 필드(#field) 문법을 사용하면, 클래스 내부에서만 접근 가능한 진정한 프라이빗 속성을 정의할 수 있게 되었다. 이는 정보 은닉을 더욱 견고하게 구현하는 데 기여한다.
6. 관련 개념
6. 관련 개념
6.1. 필드
6.1. 필드
필드는 객체 지향 프로그래밍에서 클래스 내부에 선언되는 멤버 변수로, 객체의 상태나 데이터를 저장하는 역할을 한다. 예를 들어, '사람'이라는 클래스에는 '이름', '나이', '주소'와 같은 필드가 정의될 수 있으며, 이 필드들은 각각의 사람 객체가 가지는 구체적인 정보를 담게 된다.
필드는 객체의 내부 상태를 나타내므로, 캡슐화 원칙에 따라 일반적으로 private 접근 제어자를 사용하여 외부에서 직접 접근하지 못하도록 보호된다. 이는 객체의 데이터 무결성을 유지하고, 외부 코드가 객체의 내부 구현에 의존하지 않도록 하기 위한 중요한 설계 원칙이다. 대신, 외부에서는 게터와 세터라는 특별한 메서드를 통해 필드의 값을 안전하게 읽거나 변경한다.
필드는 메서드와 함께 클래스를 구성하는 핵심 요소이다. 메서드가 객체의 행동을 정의한다면, 필드는 그 행동에 필요한 데이터를 저장하는 공간이다. 따라서 필드의 설계는 객체의 속성과 상태를 어떻게 모델링할지 결정하는 중요한 과정이다.
6.2. 메서드
6.2. 메서드
메서드는 객체 지향 프로그래밍에서 클래스나 객체에 속하는 함수 또는 프로시저를 의미한다. 필드가 객체의 상태나 데이터를 저장하는 역할을 한다면, 메서드는 그 데이터를 처리하거나 객체의 행동을 정의하는 역할을 담당한다. 즉, 메서드는 객체가 수행할 수 있는 작업이나 기능을 구현한 코드 블록이다.
메서드는 크게 인스턴스 메서드와 클래스 메서드(또는 정적 메서드)로 구분된다. 인스턴스 메서드는 특정 객체의 필드에 접근하여 상태를 변경하거나 계산을 수행하는 데 사용된다. 반면 클래스 메서드는 객체의 생성 없이 클래스 자체에 속하며, 주로 유틸리티 함수를 제공하는 데 활용된다. 많은 프로그래밍 언어에서 메서드는 매개변수를 받아들이고, 작업을 수행한 후 결과값을 반환할 수 있다.
메서드는 캡슐화 원칙을 실현하는 핵심 수단이기도 하다. 객체의 내부 데이터(필드)는 일반적으로 private으로 선언되어 외부에서 직접 접근할 수 없게 하고, 그 데이터를 안전하게 조작하거나 조회하기 위한 공개된 메서드(게터와 세터)를 제공한다. 이를 통해 객체의 무결성을 유지하고, 구현 세부 사항을 외부로부터 숨길 수 있다.
6.3. 캡슐화
6.3. 캡슐화
속성은 캡슐화를 실현하는 핵심적인 수단이다. 캡슐화는 객체 지향 프로그래밍의 기본 원칙 중 하나로, 객체의 내부 데이터와 구현 세부 사항을 외부로부터 숨기고, 공개된 인터페이스를 통해서만 상호작용하도록 하는 것을 의미한다. 속성을 통해 내부 필드를 private으로 선언하고, 게터와 세터라는 공개 메서드를 제공함으로써 이 원칙을 지킬 수 있다.
이 방식의 가장 큰 장점은 객체의 무결성을 보장할 수 있다는 점이다. 필드를 직접 공개하면, 외부 코드에서 유효하지 않은 값을 마음대로 할당할 수 있어 객체의 상태가 손상될 위험이 있다. 반면, 속성을 사용하면 세터 메서드 내부에 데이터 검증 로직을 추가하여, 항상 유효한 값만 객체에 저장되도록 강제할 수 있다. 예를 들어, 나이를 나타내는 필드에 음수 값이 설정되지 않도록 방지하는 것이 가능해진다.
또한, 속성을 사용하면 내부 구현의 변경이 외부 코드에 미치는 영향을 최소화할 수 있다. 나중에 필드의 데이터 타입을 변경하거나, 값을 계산하여 반환하는 방식으로 변경하더라도, 공개된 게터와 세터의 인터페이스만 유지한다면 해당 속성을 사용하는 모든 외부 코드는 수정 없이 정상적으로 동작한다. 이는 소프트웨어의 유지보수성과 확장성을 크게 향상시킨다.
7. 여담
7. 여담
속성은 객체 지향 프로그래밍의 기본 구성 요소이지만, 그 구현과 철학은 언어와 패러다임에 따라 상당한 차이를 보인다. 예를 들어, C#과 Kotlin은 언어 차원에서 프로퍼티 문법을 제공하여 게터와 세터를 명시적으로 정의하는 반면, Python은 @property 데코레이터를 사용하여 메서드를 속성처럼 접근할 수 있게 한다. JavaScript의 경우, ECMAScript 5부터 Object.defineProperty() 메서드를 통해 속성의 게터와 세터를 정의할 수 있게 되었다.
일부 함수형 프로그래밍 언어나 패러다임에서는 변경 가능한 상태를 지양하기 때문에, 전통적인 의미의 속성(상태 저장 및 변경)보다는 불변 객체의 값을 계산하거나 제공하는 개념에 더 초점을 맞춘다. 또한, 리플렉션이나 메타프로그래밍을 지원하는 언어에서는 프로그램 실행 중에 동적으로 속성을 추가하거나 조작하는 것이 가능한 경우도 있다.
속성의 설계는 캡슐화와 모듈성에 직접적인 영향을 미친다. 잘 설계된 속성 인터페이스(게터/세터)는 내부 구현을 숨기면서도, 향후 데이터 검증 로직 추가나 계산 방식 변경과 같은 유지보수를 용이하게 한다. 반면, 모든 필드에 대해 무분별하게 게터와 세터를 생성하는 것은 객체의 내부 상태를 과도하게 노출시켜 캡슐화 원칙을 훼손할 수 있다는 비판도 존재한다.
